/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ejbs;

import dtos.LinhaEncomendaDTO;
import entities.Encomenda;
import entities.Fornecedor;
import entities.LinhaEncomenda;
import entities.Produto;
import excecoes.EntidadeNaoExistenteException;
import exceptions.EntidadeExistenteException;
import java.util.LinkedList;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.EJBException;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

/**
 *
 * @author Diogo
 */
@Stateless
public class LinhaEncomendaBean {
    
    @PersistenceContext(name = "Gestao_FarmaciasPU")
    private EntityManager em;
    
    @EJB
    private ProdutoBean produtobean;

    @EJB
    private FornecedorBean fornecedorBean;
    
    public void criarLinhaEncomenda(String fornecedor, Long encomenda, String produto, Integer quantidade)throws EntidadeNaoExistenteException{
        try{
            if(!produtobean.existeProduto(produto))
                throw new EntidadeNaoExistenteException ("produto não existente");

            Encomenda enc = em.find(Encomenda.class,encomenda);
            if(enc==null)
                throw new EntidadeNaoExistenteException ("Encomenda não existente");
            if(!fornecedorBean.existeFornecedor(fornecedor))
                throw new EntidadeNaoExistenteException ("Fornecedor não existente");

            LinhaEncomenda le = new LinhaEncomenda(em.find(Fornecedor.class, fornecedor), enc, em.find(Produto.class, produto), quantidade);
            em.persist(le);
            enc.getLinhasEncomenda().add(le);
            
        }catch(Exception e){
            throw new EJBException(e.getMessage());
        }
    }

    public List<LinhaEncomendaDTO> getAllLinhaEncomendas(Long id) {
       try {
            List<LinhaEncomenda> linhaEncomendas = (List<LinhaEncomenda>) em.createNamedQuery("findAllLinhaEncomendas").setParameter("id", id).getResultList();
            return copiarLinhaEncomendasParaDTO(linhaEncomendas);
        } catch (Exception e) {
            throw new EJBException(e.getMessage());
        }
    }
    public List<LinhaEncomendaDTO> copiarLinhaEncomendasParaDTO(List<LinhaEncomenda> linhaEncomendas) {
        List<LinhaEncomendaDTO> dtos = new LinkedList<>();

        for (LinhaEncomenda le : linhaEncomendas) {
            dtos.add(new LinhaEncomendaDTO(le.getId(),le.getFornecedor().getNome(), le.getProduto().getNome(), le.getQuantidade(), le.getEncomenda().getId()));
        }
        return dtos;
    }

    public LinhaEncomendaDTO getLinhaEncomenda(Long id) {
        LinhaEncomenda le = em.find(LinhaEncomenda.class, id);
        return new LinhaEncomendaDTO(le.getId(), le.getFornecedor().getNome(), le.getProduto().getNome(),
                le.getQuantidade(), le.getEncomenda().getId());
    }

    public void atualizalinhaEncomenda(Long id,String fornecedor, Integer quantidade)throws EntidadeNaoExistenteException {
        try{
            Fornecedor f = em.find(Fornecedor.class, fornecedor);
            if(f ==null)
                throw new EntidadeNaoExistenteException("Fornecedor não existe");
            LinhaEncomenda le = em.find(LinhaEncomenda.class, id);
            le.setFornecedor(f);
            le.setQuantidade(quantidade);
        } catch (EntidadeNaoExistenteException e) {
            throw e;
        }catch(Exception e){
             throw new EJBException(e.getMessage());
        }
    }

}
